to <literal>false</literal>.</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>change-update-summary</varname></term>
+ <listitem><para>Boolean value controlling whether or not to
+ automatically update the summary file after any ref is added,
+ removed, or updated. This covers a superset of the cases covered by
+ commit-update-summary, with the exception of orphan commits which
+ shouldn't affect the summary anyway. Defaults to <literal>false</literal>.
+ </para></listitem>
+ </varlistentry>
+
<varlistentry>
<term><varname>fsync</varname></term>
<listitem><para>Boolean value controlling whether or not to
return FALSE;
g_clear_pointer (&self->txn.collection_refs, g_hash_table_destroy);
+ /* Update the summary if change-update-summary is set, because doing so was
+ * delayed for each ref change during the transaction.
+ */
+ if (!_ostree_repo_maybe_regenerate_summary (self, cancellable, error))
+ return FALSE;
+
self->in_transaction = FALSE;
if (!ot_ensure_unlinked_at (self->repo_dir_fd, "transaction", 0))
const char *name,
GError **error);
+gboolean
+_ostree_repo_maybe_regenerate_summary (OstreeRepo *self,
+ GCancellable *cancellable,
+ GError **error);
+
/* Locking APIs are currently private.
* See https://github.com/ostreedev/ostree/pull/1555
*/
if (!_ostree_repo_update_mtime (self, error))
return FALSE;
+ /* Update the summary after updating the mtime so the summary doesn't look
+ * out of date */
+ if (!self->in_transaction && !_ostree_repo_maybe_regenerate_summary (self, cancellable, error))
+ return FALSE;
+
return TRUE;
}
* will aid clients in working out when to check for updates.
*
* It is regenerated automatically after a commit if
- * `core/commit-update-summary` is set.
+ * `core/commit-update-summary` is set, and automatically after any ref is
+ * added, removed, or updated if `core/change-update-summary` is set.
*
* If the `core/collection-id` key is set in the configuration, it will be
* included as %OSTREE_SUMMARY_COLLECTION_ID in the summary file. Refs that
return TRUE;
}
+/* Regenerate the summary if `core/change-update-summary` is set */
+gboolean
+_ostree_repo_maybe_regenerate_summary (OstreeRepo *self,
+ GCancellable *cancellable,
+ GError **error)
+{
+ gboolean update_summary;
+
+ if (!ot_keyfile_get_boolean_with_default (self->config, "core",
+ "change-update-summary", FALSE,
+ &update_summary, error))
+ return FALSE;
+
+ if (update_summary && !ostree_repo_regenerate_summary (self,
+ NULL,
+ cancellable,
+ error))
+ return FALSE;
+
+ return TRUE;
+}
+
gboolean
_ostree_repo_is_locked_tmpdir (const char *filename)
{
if (!skip_commit)
{
- gboolean update_summary;
guint64 timestamp;
+ gboolean change_update_summary;
if (!opt_no_bindings)
{
if (!ostree_repo_commit_transaction (repo, &stats, cancellable, error))
goto out;
- /* The default for this option is FALSE, even for archive repos,
- * because ostree supports multiple processes committing to the same
- * repo (but different refs) concurrently, and in fact gnome-continuous
- * actually does this. In that context it's best to update the summary
- * explicitly instead of automatically here. */
if (!ot_keyfile_get_boolean_with_default (ostree_repo_get_config (repo), "core",
- "commit-update-summary", FALSE,
- &update_summary, error))
+ "change-update-summary", FALSE,
+ &change_update_summary, error))
goto out;
- if (update_summary && !ostree_repo_regenerate_summary (repo,
- NULL,
- cancellable,
- error))
- goto out;
+ /* No need to update it again if we did for each ref change */
+ if (opt_orphan || !change_update_summary)
+ {
+ gboolean commit_update_summary;
+
+ /* The default for this option is FALSE, even for archive repos,
+ * because ostree supports multiple processes committing to the same
+ * repo (but different refs) concurrently, and in fact gnome-continuous
+ * actually does this. In that context it's best to update the summary
+ * explicitly instead of automatically here. */
+ if (!ot_keyfile_get_boolean_with_default (ostree_repo_get_config (repo), "core",
+ "commit-update-summary", FALSE,
+ &commit_update_summary, error))
+ goto out;
+
+ if (commit_update_summary && !ostree_repo_regenerate_summary (repo,
+ NULL,
+ cancellable,
+ error))
+ goto out;
+ }
}
else
{
setup_test_repository "bare"
echo "ok setup"
+# Check that without commit-update-summary set, creating a commit doesn't update the summary
mkdir test
echo hello > test/a
assert_streq "$OLD_MD5" "$(md5sum repo/summary)"
+# Check that with commit-update-summary set, creating a commit updates the summary
$OSTREE --repo=repo config set core.commit-update-summary true
echo hello3 > test/a
assert_not_streq "$OLD_MD5" "$(md5sum repo/summary)"
+$OSTREE --repo=repo config set core.commit-update-summary false
+
# Check that summary --update deletes the .sig file
touch repo/summary.sig
$OSTREE summary --update
assert_not_has_file repo/summary.sig
+
+# Check that without change-update-summary set, adding, changing, or deleting a ref doesn't update the summary
+$OSTREE summary --update
+OLD_MD5=$(md5sum repo/summary)
+$OSTREE commit -b test2 -s "A commit" test
+
+assert_streq "$OLD_MD5" "$(md5sum repo/summary)"
+
+$OSTREE reset test test^
+
+assert_streq "$OLD_MD5" "$(md5sum repo/summary)"
+
+$OSTREE refs --delete test
+
+assert_streq "$OLD_MD5" "$(md5sum repo/summary)"
+
+# Check that with change-update-summary set, adding, changing, or deleting a ref updates the summary
+$OSTREE --repo=repo config set core.change-update-summary true
+
+$OSTREE summary --update
+OLD_MD5=$(md5sum repo/summary)
+echo hello > test/a
+$OSTREE commit -b test -s "A commit" test
+echo hello2 > test/a
+$OSTREE commit -b test -s "Another commit" test
+
+assert_not_streq "$OLD_MD5" "$(md5sum repo/summary)"
+
+OLD_MD5=$(md5sum repo/summary)
+$OSTREE reset test test^
+
+assert_not_streq "$OLD_MD5" "$(md5sum repo/summary)"
+
+OLD_MD5=$(md5sum repo/summary)
+$OSTREE refs --delete test
+
+assert_not_streq "$OLD_MD5" "$(md5sum repo/summary)"